﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CancioneroCONFAD.DAL;
using CancioneroCONFAD.Utilidades;
using SubSonic.Repository;

namespace CancioneroCONFAD.Formularios
{
    public partial class VerCanciones : Form
    {
        private readonly IList<TipoAlabanza> _tiposAlabanzaSeleccionados= new List<TipoAlabanza>();
        private readonly SimpleRepository _repository = new SimpleRepository("Cancionero", SimpleRepositoryOptions.None);
        private int idCancionSeleccionada = 0;
        public VerCanciones()
        {
            InitializeComponent();
        }

        private void VerCanciones_Load(object sender, EventArgs e)
        {
            try
            {
                var canciones1 = (from c in _repository.All<Cancion>()
                                select c).ToList();
                var canciones = canciones1.Select(c => new
                {
                    c.Id,
                    c.Titulo,
                    c.Artista,
                    Letra = c.FragmentosCompleto.Length > 20 ? c.FragmentosCompleto.Substring(0, 19).Replace('\n', ' ') + "..." : c.FragmentosCompleto.Replace('\n', ' '),
                    c.TipoAlabanza
                });
                bindingSource1.DataSource = canciones;
                dgCanciones.DataSource = bindingSource1;
                dgCanciones.AutoGenerateColumns = true;
                if (dgCanciones != null)
                {
                    if (dgCanciones.Columns != null)
                    {
                        if (dgCanciones.Columns.Contains("Id"))
                        {
                            dgCanciones.Columns["Id"].Visible = false;
                        }
                    }
                }
                dgCanciones.AutoResizeColumns(
                    DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
            }
            catch(Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void NuevaBusqueda(object sender, EventArgs e)
        {
            try
            {
                RealizarBusqueda();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void dgCanciones_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                var row = dgCanciones.Rows[e.RowIndex];
                var idCancion = int.Parse(row.Cells["Id"].Value.ToString());
                var cancion = _repository.Single<Cancion>(idCancion);
                idCancionSeleccionada = cancion.Id;
                var letra = cancion.FragmentosCompleto.Replace('\n', ' ');
                txtArtista.Text = cancion.Artista;
                txtTitulo.Text = cancion.Titulo;
                txtFragmento.Text = letra.Length > 50 ? letra.Substring(0, 49) : letra;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void chkAdoracion_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (chkAdoracion.Checked)
                {
                    _tiposAlabanzaSeleccionados.Add(TipoAlabanza.Adoracion);

                }
                else
                {
                    _tiposAlabanzaSeleccionados.Remove(TipoAlabanza.Adoracion);
                }
                RealizarBusqueda();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        public void RealizarBusqueda()
        {
            var texto = txtBusqueda.Text;
            var canciones1 = (from c in _repository.All<Cancion>()
                              select c).ToList();
            var canciones2 = canciones1.Where(x => x.Titulo.Contains(texto) || x.FragmentosCompleto.Contains(texto));
            var canciones3 = _tiposAlabanzaSeleccionados.Count() > 0
                                 ? canciones2.Where(x => _tiposAlabanzaSeleccionados.Contains(x.TipoCancion))
                                 : canciones2;
            var canciones = canciones3.Select(c => new
            {
                c.Id,
                c.Titulo,
                c.Artista,
                Letra = c.FragmentosCompleto.Length > 20 ? c.FragmentosCompleto.Substring(0, 19).Replace('\n', ' ') + "..." : c.FragmentosCompleto.Replace('\n', ' '),
                c.TipoAlabanza
            });

            bindingSource1.DataSource = canciones;
            dgCanciones.DataSource = bindingSource1;
            dgCanciones.AutoGenerateColumns = true;

            dgCanciones.AutoResizeColumns(
                DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
        }

        private void chkModerada_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (chkModerada.Checked)
                {
                    _tiposAlabanzaSeleccionados.Add(TipoAlabanza.Moderada);

                }
                else
                {
                    _tiposAlabanzaSeleccionados.Remove(TipoAlabanza.Moderada);
                }
                RealizarBusqueda();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void chkJubilo_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (chkJubilo.Checked)
                {
                    _tiposAlabanzaSeleccionados.Add(TipoAlabanza.Jubilo);

                }
                else
                {
                    _tiposAlabanzaSeleccionados.Remove(TipoAlabanza.Jubilo);
                }
                RealizarBusqueda();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void btnEditar_Click(object sender, EventArgs e)
        {
            try
            {
                if (idCancionSeleccionada == 0)
                {
                    MessageBox.Show("Debe seleccionar una canción a editar.", "Información", MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                }
                else
                {
                    var frm = new EditarCancion(idCancionSeleccionada){MdiParent = this.MdiParent,WindowState = FormWindowState.Maximized};
                    frm.Show();
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                if (idCancionSeleccionada == 0)
                {
                    MessageBox.Show("Debe seleccionar una canción a eliminar.", "Información", MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                }
                else
                {
                    var cancion = _repository.Single<Cancion>(idCancionSeleccionada);
                    var resp=MessageBox.Show("Esta seguro de eliminar la canción "+cancion.Titulo, "Lea", MessageBoxButtons.YesNo,
                                MessageBoxIcon.Warning);

                    if(resp.ToString()=="Yes")
                    {
                        _repository.DeleteMany<CancionEnLista>(x => x.IdCancion == cancion.Id);
                        _repository.Delete<Cancion>(cancion.Id);
                        MessageBox.Show("La cancion " + cancion.Titulo + " ha sido eliminada correctamente.",
                                        "Información", MessageBoxButtons.OK,
                                        MessageBoxIcon.Information);
                        RealizarBusqueda();
                    }
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void btnVer_Click(object sender, EventArgs e)
        {
            try
            {
                if (idCancionSeleccionada == 0)
                {
                    MessageBox.Show("Debe seleccionar una canción a ver.", "Información", MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                }
                else
                {
                    var frm = new VerCancion(idCancionSeleccionada){MdiParent = MdiParent,WindowState = FormWindowState.Maximized};
                    frm.Show();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }


    }
}
